package org.jeecg.config.mybatis;

import java.util.ArrayList;
import java.util.List;

import org.jeecg.common.util.oConvertUtils;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;

import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;

/**
 * 单数据源配置（jeecg.datasource.open = false时生效）
 * @Author zhoujf
 *
 */
@Configuration
@MapperScan(value={"org.jeecg.modules.**.mapper*"})
public class MybatisPlusSaasConfig {
    /**
     * tenant_id 字段名
     */
    private static final String TENANT_FIELD_NAME = "tenant_id";
    /**
     * 哪些表需要做多租户 表需要添加一个字段 tenant_id
     */
    private static final List<String> TENANT_TABLE = new ArrayList<String>();

    static {
        TENANT_TABLE.add("demo");

//角色、菜单、部门
        TENANT_TABLE.add("sys_role");                //角色
        TENANT_TABLE.add("sys_permission");          //菜单//菜单的租户模式与微信第三方登录有冲突，会导致微信登录时候带上tenant_id=0条件查询菜单权限(该条件是前端页面传入)，为解决第三方登录问题取消菜单的租户模式，改为手动实现多租户模式
        TENANT_TABLE.add("sys_role_permission");

        //前端user.js的第三方登录方法ThirdLogin中第197行增加用户的租户id属性解决tenant-id=0的问题： Vue.ls.set(TENANT_ID, userInfo.tenantId, 7 * 24 * 60 * 60 * 1000)
        TENANT_TABLE.add("sys_depart");              //部门
        //TENANT_TABLE.add("sys_user");                //用户,在查询是单独处理多租户模式，考虑到跨租户给用户授权，需单独处理，不在统一处理
        TENANT_TABLE.add("sys_position");            //岗位
        TENANT_TABLE.add("sys_announcement");        //系统通告

        TENANT_TABLE.add("cou_subject");        //科目
        TENANT_TABLE.add("cou_class");        //班级
        TENANT_TABLE.add("cou_grade");        //年级
        TENANT_TABLE.add("rel_class_subject_teacher");        //关系表
        TENANT_TABLE.add("stu_student");        //学生
        TENANT_TABLE.add("tea_teacher");        //教师
        TENANT_TABLE.add("cou_course_schedule");        //课表模板
        TENANT_TABLE.add("cou_course_schedule_atom");        //课表详情
        TENANT_TABLE.add("cou_courseschedule_template");        //周课表模板
        TENANT_TABLE.add("cou_cour_sche_template_atom");        //模板详情
        TENANT_TABLE.add("ora_school");        //学校
        TENANT_TABLE.add("fac_building");        //建筑
        TENANT_TABLE.add("fac_classroom");        //教室
        TENANT_TABLE.add("cou_school_year");        //学年
        TENANT_TABLE.add("cou_semester");        //学期
        TENANT_TABLE.add("cou_gradesession_year");        //届级年份编码

        TENANT_TABLE.add("cou_course_plan");        //计划表
        TENANT_TABLE.add("rel_class_classroom");        //计划表
        TENANT_TABLE.add("rel_class_student");        //计划表
        TENANT_TABLE.add("rel_school_year_semester");        //计划表
        TENANT_TABLE.add("rel_cour_sche_temp_app");        //计划表

        TENANT_TABLE.add("ach_achieve_standard_item");//标准分项
        TENANT_TABLE.add("ach_achievement_standard");//标准
        TENANT_TABLE.add("ach_achievement_subj_proj_item");//分项成绩
        TENANT_TABLE.add("ach_achievement_subject");//科目成绩
        TENANT_TABLE.add("ach_exam_paper_answer_record");//答题记录
        TENANT_TABLE.add("ach_exam_paper_answer_record_item");//答题记录详细记录
        TENANT_TABLE.add("ach_exam_paper_project_item");//试卷题型分项
        TENANT_TABLE.add("ach_exam_paper_questions_item");//试卷试题列表记录
//        TENANT_TABLE.add("ach_exam_project_template");//分项模板（暂时无用）
        TENANT_TABLE.add("ach_examination");//考试
        TENANT_TABLE.add("ach_examination_paper");//试卷
//        TENANT_TABLE.add("ach_question_bank_item");//题库：计划创建统一题库，不做数据隔离
        TENANT_TABLE.add("rel_ach_standard_distribution");//标准应用对象分配关系

        TENANT_TABLE.add("sys_third_oauth_relationship");//第三方系统：如学科网
    }


    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
            @Override
            public Expression getTenantId() {
                String tenantId = oConvertUtils.getString(TenantContext.getTenant(),"0");
                return new LongValue(tenantId);
            }

            @Override
            public String getTenantIdColumn(){
                return TENANT_FIELD_NAME;
            }

            // 返回 true 表示不走租户逻辑
            @Override
            public boolean ignoreTable(String tableName) {
                for(String temp: TENANT_TABLE){
                    if(temp.equalsIgnoreCase(tableName)){
                        if("0".equals(getTenantId().toString()) || "1".equals(getTenantId().toString())){
                            //默认不走租户逻辑：获取租户失败或者租户是顶级管理租户，则不走租户逻辑
                            return true;
                        }
                        return false;
                    }
                }
                return true;
            }
        }));
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }

//    /**
//     * 下个版本会删除，现在为了避免缓存出现问题不得不配置
//     * @return
//     */
//    @Bean
//    public ConfigurationCustomizer configurationCustomizer() {
//        return configuration -> configuration.setUseDeprecatedExecutor(false);
//    }
//    /**
//     * mybatis-plus SQL执行效率插件【生产环境可以关闭】
//     */
//    @Bean
//    public PerformanceInterceptor performanceInterceptor() {
//        return new PerformanceInterceptor();
//    }

}
